﻿
#ifndef  I_EVENT_H
#define I_EVENT_H

#include <deque>
#include <mutex>

// 事件桥梁
// 注意：应用层 popFront 桥梁元素的定时器一定要放在 onEnterTransitionDidFinish() 里，千万别写在 init() 里
class IEventBridge 
{
public:
	enum{ EVENT_BODY_LEN = 1024,		};
	struct  EVENT_INFO
	{
		EVENT_INFO()	{ memset(this, 0, sizeof(*this));	 }

		int min2(int a, int b)
		{
			if (a > b)
				return b;
			else
				return a;
		}

		int copyToBody(const char* pData, int iDataLen)
		{
			if (iDataLen > EVENT_BODY_LEN)
				return 10;
			iBodyLen = min2(iDataLen, EVENT_BODY_LEN);
			memcpy(szBody, pData, iBodyLen);
			return 0;
		}

		int		iClientId;
		int		iMainCode;
		int		iSubCode;
		int		iBodyLen;
		char		szBody[EVENT_BODY_LEN];
	};

public:
	IEventBridge();
	virtual  ~IEventBridge();

	static	IEventBridge* getInstance();
	static void destoryInstance();

private:
	static	IEventBridge* create();

public:
	virtual bool init();

	// 加入事件消息
	bool pushBack(const EVENT_INFO& eventInfo);

	// 提取事件消息，
	// 注意：应用层 popFront 桥梁元素的定时器一定要放在 onEnterTransitionDidFinish() 里，千万别写在 init() 里
	bool popFront(EVENT_INFO& eventInfo);

public:		// 回调函数

private:
	static IEventBridge*  _pEvent;

	std::deque<EVENT_INFO>		_dequeEventMsg;			// 事件消息容器，里面的元素已经全是原子包
	std::mutex									_mutexEventMsg;			// 非递归互斥，针对 _dequeRecvMsg
};

#endif